import type { ExtIdTuple, VARCHAR255_PG, SMALLINT_PG } from "~/db.pg";

import type { ExtOwner } from "@/stream-user/core.define";
import { User } from "@/stream-user/schema.user";

import { AccessDroitContext, AccessScopeContext } from "./core.define";

/** 权限组，由前台和后台约定资源范围
 * @important 资源范围一定包含所有者的 uuid
 * @important 资源范围全表不允许重复
 * @important 资源范围无法修改，但是允许修改其他内容
 * @important 允许删除
 */
export type Access = ExtIdTuple &
  ExtOwner & {
    /** 权限的作用范围，是一个特殊组合的字符串，详见 AccessScopeContext */
    scope: VARCHAR255_PG;

    /** 授权的具体明细
     * @important 转换成二进制后，就能知道具体的权限明细
     * @important 从前往后依次代表：导出/删除/修改/创建/查询
     * @important 如 9 代表着 01101 代表支持删除、修改、以及查询
     */
    droit: SMALLINT_PG;
  } & {
    refVisitorId: User["uuid32"];
    justVisitor?: User;
  };

export type WithAccessView = Access & {
  /** 字段 scope 中的具体内容是什么 */
  withScopeContext: AccessScopeContext;
  /** 具体授权是什么 */
  withDroitContext: AccessDroitContext;
};
